/*
    定义通讯录类型，实现添加联系人方法，以及将通讯录对象序列化结果写入到文件中
*/
#include <iostream>
#include <fstream>
#include "address_book.pb.h"

// 新增一条联系人数据
void AddContacts(addressbook::Contacts* contactsPtr)
{
    std::cout << "----------------新增联系⼈----------------" << std::endl;
    // 1. 姓名
    std::cout << "输入联系人姓名：";
    std::string name;
    getline(std::cin, name);
    contactsPtr->set_name(name);

    // // 2. 年龄
    // std::cout << "输入联系人年龄：";
    // int age;
    // std::cin >> age;
    // contactsPtr->set_age(age);

    // 3. 生日
    std::cout << "输入联系人生日：";
    int birthday;
    std::cin >> birthday;
    contactsPtr->set_bithday(birthday);
    std::cout << "-------------------结束-------------------" << std::endl;
}

int main()
{
    // 1. 打开文件，如果存在从文件中加载数据
    std::fstream input("../address_book.bin", std::ios::in | std::ios::binary);
    addressbook::AddressBook addressBook;
    if(input) // 文件存在
    {
        bool ret = addressBook.ParseFromIstream(&input); // 从文件流中反序列化
        input.close();
        if(ret == false)
        {
            std::cout << "从文件中反序列化通讯录失败" << std::endl;
            return -1;
        }
    }

    // 2. 新增一条联系人
    AddContacts(addressBook.add_contacts());

    // 3. 序列化到文件流中
    std::fstream output("../address_book.bin", std::ios::out | std::ios::binary | std::ios::trunc);
    if(output)
    {
        bool ret = addressBook.SerializeToOstream(&output); // 序列化到文件流中
        output.close();
        if(ret == false)
        {
            std::cout << "序列化通讯录失败" << std::endl;
            return -1;
        }
        else
        {
            std::cout << "序列化通讯录成功，总共联系人：" << addressBook.contacts_size() << "个" << std::endl;
        }
    }
    else
    {
        std::cout << "打开文件失败" << std::endl;
        return -1;
    }
    return 0;
}